package com.loongtech.bi.action.flow;

import com.loongtech.bi.action.Base2BiSearchAction;
import com.loongtech.bi.manager.flow.HadoopQueryManager;
import com.loongtech.bi.manager.system.ConfigManager;
import com.loongtech.bi.manager.system.GameParamConfigManager;
import com.loongtech.bi.manager.system.SysLogManager;
import com.loongtech.bi.support.CommonGameParam;
import com.loongtech.bi.support.Session;
import com.loongtech.core.util.Time;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
 * 流水查询—物品流水Action
 *
 * @author Marin
 * @date 2015年09月17日
 */
@Controller
@Scope("view")
public class RealtimeItemFlowAction extends Base2BiSearchAction {
	private static final long serialVersionUID = 1L;
    protected Date dateStart = new Date(Time.getBeginningOfDay(Time.currentTime() - 1 * Time.DAY));
    protected Date dateEnd = new Date(Time.getBeginningOfDay(Time.currentTime()));

    private ItemFlow queryBean;  // 查询bean
    private int reason = -99999; // 获得的原因
    private int reasonparam = -99999; // reason的细分类型
    private int consumeReason = -99999; // 消耗的原因
    private int consumeReasonparam = -99999; // consumeReason的细分类型

    private Map<String, String> typeItmes = GameParamConfigManager.getItems(CommonGameParam.ITEM_TYPE);  // 物品类型
    private Map<String, String> typeItmesRevise = GameParamConfigManager.getItemsRevise(CommonGameParam.ITEM_TYPE);  // 物品类型反转
    private Map<String, String> reasonItmes = GameParamConfigManager.getItems(CommonGameParam.ITEM_GET_REASON);  // 获得原因
    private Map<String, String> reasonItmesRevise = GameParamConfigManager.getItemsRevise(CommonGameParam.ITEM_GET_REASON);  // 获得原因反转
    private Map<String, String> reasonDetailItmes = GameParamConfigManager.getItems(CommonGameParam.ITEM_GET_DETAIL_REASON);  // 获得原因细分
    private Map<String, String> reasonDetailItmesRevise = GameParamConfigManager.getItemsRevise(CommonGameParam.ITEM_GET_DETAIL_REASON);  // 获得原因细分反转
    private Map<String, String> reasonConsumeItmes = GameParamConfigManager.getItems(CommonGameParam.ITEM_CONSUME_REASON); //消耗原因
    private Map<String, String> reasonConsumeItmesRevise = GameParamConfigManager.getItemsRevise(CommonGameParam.ITEM_CONSUME_REASON); // 消耗原因反转
    private Map<String, String> reasonConsumeDetailItmes = GameParamConfigManager.getItems(CommonGameParam.ITEM_CONSUME_DETAIL_REASON); // 消耗原因细分
    private Map<String, String> reasonConsumeDetailItmesRevise = GameParamConfigManager.getItemsRevise(CommonGameParam.ITEM_CONSUME_DETAIL_REASON); // 消耗原因细分反转

    private List<Object[]> result;  // 结果List

    private boolean hasDetailReason;  // 游戏有没有细分原因，如果有，前端显示，如果没有，前端隐藏

    @Autowired
    private ConfigManager configManager;

    @Autowired
    HadoopQueryManager hadoopQueryManager;

    @Autowired
    private SysLogManager sysLogManager;
    @Autowired
    private Session session;

    @PostConstruct
    public void init() {
        queryBean = new ItemFlow();
        result = new ArrayList<>();
        reason = -99999; // 获得的原因
        reasonparam = -99999; // reason的细分类型
        consumeReason = -99999; // 消耗的原因
        consumeReasonparam = -99999; // consumeReason的细分类型

        hasDetailReason = "1".equals(configManager.getConfigValueByName(ConfigManager.HAS_ITEM_DETAIL_REASON)) ? true : false;
    }

    public void search() {
        sysLogManager.addLog(session.getUserName(), "查询流水查询—物品流水");

        result = new ArrayList<>();

        FacesContext context = FacesContext.getCurrentInstance();

        // 开始结束时间不能大于当前时间60天
        if (Time.getInterval(new Date(), dateStart) > 60 || Time.getInterval(new Date(), dateEnd) > 60) {
            context.addMessage(null, new FacesMessage("提示", "开始结束时间不能小于当前时间60天!"));
            return;
        }

        // 用户ID，角色ID必要有一个非空
        if (StringUtils.isBlank(queryBean.getUserid()) && StringUtils.isBlank(queryBean.getRoleid())) {
            context.addMessage(null, new FacesMessage("提示", "用户ID，角色ID必须至少有一个非空!"));
            return;
        }

        if (HadoopQueryManager.VISIT_QUEUE.offer("ItemFlowAction")) {
            System.out.println("VISIT_QUEUE offer ItemFlowAction ok!");

            StringBuffer sql = new StringBuffer();
            sql.append("select logtime,platform,channel,serverid,userid,roleid,rolelevel,reason," + (hasDetailReason ? "reasonparam" : "reason as reasonparam") + ",changenum,leftnum,itemid from realtime_item where 1=1 ");
            if (queryBean.getUserid() != null && !"".equals(queryBean.getUserid())) {
                sql.append(" and userid = '");
                sql.append(queryBean.getUserid().trim());
                sql.append("' ");
            }
            if (!StringUtils.isBlank(queryBean.getRoleid())) {
                sql.append(" and cast(roleid as string) = '");
                sql.append(queryBean.getRoleid());
                sql.append("' ");
            }
            if (!"0".equals(queryPlatform)) {
                sql.append(" and platform = ");
                sql.append(queryPlatform);
            }
            if (!"0".equals(queryChannel)) {
                sql.append(" and channel = '");
                sql.append(queryChannel);
                sql.append("' ");
            }
            if (!"0".equals(queryServer)) {
                sql.append(" and serverid = ");
                sql.append(queryServer);
            }
            if (queryBean.getItemid() != null && !"".equals(queryBean.getItemid())) {
                if (typeItmes.get(queryBean.getItemid()) != null) {  // 名称
                    sql.append(" and itemid = '");
                    sql.append(typeItmes.get(queryBean.getItemid().trim()));
                    sql.append("' ");
                } else {
                    sql.append(" and itemid = '");
                    sql.append(queryBean.getItemid().trim());
                    sql.append("' ");
                }
            }
            if (reason != -99999) {
                sql.append(" and reason = ");
                sql.append(reason);
            }
            if (reasonparam != -99999) {
                sql.append(" and reasonparam = ");
                sql.append(reasonparam);
            }
            if (consumeReason != -99999) {
                sql.append(" and reason = ");
                sql.append(consumeReason);
            }
            if (consumeReasonparam != -99999) {
                sql.append(" and reasonparam = ");
                sql.append(consumeReasonparam);
            }
            sql.append(" and dt >= '");
            sql.append(Time.getDateStr(dateStart));
            sql.append("' and dt <= '");
            sql.append(Time.getDateStr(dateEnd));
            sql.append("' ");
            sql.append(" order by logtime desc ");

            System.out.println(sql.toString());
            Entry<List<String>, List<Object[]>> ret = hadoopQueryManager.executeSQL(sql.toString());
            if (null == ret || null == ret.getKey() || ret.getKey().isEmpty() || null == ret.getValue()) {
                context.addMessage(null, new FacesMessage("提示", "查询结果为空!"));
                return;
            }

            result = ret.getValue();
        } else {
            System.out.println("VISIT_QUEUE offer ItemFlowAction failed!");
            context.addMessage(null, new FacesMessage("提示", "当前系统正被访问，为保证服务器稳定，请稍后再试"));
            return;
        }
    }

    // 查询物品名称
    public String getItemType(Object itemType) {
        String key = itemType == null ? "" : Math.abs(Integer.parseInt(itemType.toString())) + "";
        return (typeItmesRevise.get(key) == null) ? key : typeItmesRevise.get(key);
    }

    // 查询消耗/获得类型
    public String getReasonType(Object reasonType, Object num) {
        String key = reasonType == null ? "" : Math.abs(Integer.parseInt(reasonType.toString())) + "";
        int count = num == null ? -9999999 : Integer.parseInt(num.toString());
        return count > 0 ? ((reasonItmesRevise.get(key) == null) ? key : reasonItmesRevise.get(key)) : ((reasonConsumeItmesRevise.get(key) == null) ? key : reasonConsumeItmesRevise.get(key));
    }

    // 查询消耗/获得细分类型
    public String getReasonDetailType(Object reasonDeailType, Object num) {
        String key = reasonDeailType == null ? "" : Math.abs(Integer.parseInt(reasonDeailType.toString())) + "";
        int count = num == null ? -9999999 : Integer.parseInt(num.toString());
        return count > 0 ? ((reasonDetailItmesRevise.get(key) == null) ? key : reasonDetailItmesRevise.get(key)) : ((reasonConsumeDetailItmesRevise.get(key) == null) ? key : reasonConsumeDetailItmesRevise.get(key));
    }

    public class ItemFlow {
        private String logtime; // 时间
        private String hostname; // 服务器主机名
        private String modulename; // 模块名
        private int gameid; // 游戏ID
        private int serverid; // 服务器ID
        private long logid; // 日志编号
        private String logtype; // 日志类型
        private int platform; // 平台ID
        private String channel; // 渠道标识
        private String mac; // 设备mac地址
        private String userid; // 账号ID
        private String roleid; // 角色ID
        private int rolelevel; // 角色等级
        private String itemid; // 物品ID
        private int reason = -99999; // 消耗或获得的原因
        private int changenum; // 消耗或获得数量
        private long leftnum; // 当前此类型货币总量
        private int reasonparam = -99999; // reason的细分类型
        private String dt; // 时间

        public String getLogtime() {
            return logtime;
        }

        public void setLogtime(String logtime) {
            this.logtime = logtime;
        }

        public String getHostname() {
            return hostname;
        }

        public void setHostname(String hostname) {
            this.hostname = hostname;
        }

        public String getModulename() {
            return modulename;
        }

        public void setModulename(String modulename) {
            this.modulename = modulename;
        }

        public int getGameid() {
            return gameid;
        }

        public void setGameid(int gameid) {
            this.gameid = gameid;
        }

        public int getServerid() {
            return serverid;
        }

        public void setServerid(int serverid) {
            this.serverid = serverid;
        }

        public long getLogid() {
            return logid;
        }

        public void setLogid(long logid) {
            this.logid = logid;
        }

        public String getLogtype() {
            return logtype;
        }

        public void setLogtype(String logtype) {
            this.logtype = logtype;
        }

        public int getPlatform() {
            return platform;
        }

        public void setPlatform(int platform) {
            this.platform = platform;
        }

        public String getChannel() {
            return channel;
        }

        public void setChannel(String channel) {
            this.channel = channel;
        }

        public String getMac() {
            return mac;
        }

        public void setMac(String mac) {
            this.mac = mac;
        }

        public String getUserid() {
            return userid;
        }

        public void setUserid(String userid) {
            this.userid = userid;
        }

        public String getRoleid() {
            return roleid;
        }

        public void setRoleid(String roleid) {
            this.roleid = roleid;
        }

        public int getRolelevel() {
            return rolelevel;
        }

        public void setRolelevel(int rolelevel) {
            this.rolelevel = rolelevel;
        }

        public int getReason() {
            return reason;
        }

        public void setReason(int reason) {
            this.reason = reason;
        }

        public int getChangenum() {
            return changenum;
        }

        public void setChangenum(int changenum) {
            this.changenum = changenum;
        }

        public long getLeftnum() {
            return leftnum;
        }

        public void setLeftnum(long leftnum) {
            this.leftnum = leftnum;
        }

        public String getDt() {
            return dt;
        }

        public void setDt(String dt) {
            this.dt = dt;
        }

        public String getItemid() {
            return itemid;
        }

        public void setItemid(String itemid) {
            this.itemid = itemid;
        }

        public int getReasonparam() {
            return reasonparam;
        }

        public void setReasonparam(int reasonparam) {
            this.reasonparam = reasonparam;
        }
    }

    @Override
    protected String csvContent() {
        return null;
    }

    @Override
    protected String csvFileName() {
        return null;
    }

    public ItemFlow getQueryBean() {
        return queryBean;
    }

    public void setQueryBean(ItemFlow queryBean) {
        this.queryBean = queryBean;
    }

    public List<Object[]> getResult() {
        return result;
    }

    public void setResult(List<Object[]> result) {
        this.result = result;
    }

    public Date getDateStart() {
        return dateStart;
    }

    public void setDateStart(Date dateStart) {
        this.dateStart = dateStart;
    }

    public Map<String, String> getReasonItmes() {
        return reasonItmes;
    }

    public void setReasonItmes(Map<String, String> reasonItmes) {
        this.reasonItmes = reasonItmes;
    }

    public Map<String, String> getReasonItmesRevise() {
        return reasonItmesRevise;
    }

    public void setReasonItmesRevise(Map<String, String> reasonItmesRevise) {
        this.reasonItmesRevise = reasonItmesRevise;
    }

    public Map<String, String> getReasonDetailItmes() {
        return reasonDetailItmes;
    }

    public void setReasonDetailItmes(Map<String, String> reasonDetailItmes) {
        this.reasonDetailItmes = reasonDetailItmes;
    }

    public boolean isHasDetailReason() {
        return hasDetailReason;
    }

    public void setHasDetailReason(boolean hasDetailReason) {
        this.hasDetailReason = hasDetailReason;
    }

    public Map<String, String> getTypeItmes() {
        return typeItmes;
    }

    public void setTypeItmes(Map<String, String> typeItmes) {
        this.typeItmes = typeItmes;
    }

    public Map<String, String> getTypeItmesRevise() {
        return typeItmesRevise;
    }

    public void setTypeItmesRevise(Map<String, String> typeItmesRevise) {
        this.typeItmesRevise = typeItmesRevise;
    }

    public Map<String, String> getReasonConsumeItmes() {
        return reasonConsumeItmes;
    }

    public void setReasonConsumeItmes(Map<String, String> reasonConsumeItmes) {
        this.reasonConsumeItmes = reasonConsumeItmes;
    }

    public Map<String, String> getReasonConsumeItmesRevise() {
        return reasonConsumeItmesRevise;
    }

    public void setReasonConsumeItmesRevise(Map<String, String> reasonConsumeItmesRevise) {
        this.reasonConsumeItmesRevise = reasonConsumeItmesRevise;
    }

    public Map<String, String> getReasonConsumeDetailItmes() {
        return reasonConsumeDetailItmes;
    }

    public void setReasonConsumeDetailItmes(Map<String, String> reasonConsumeDetailItmes) {
        this.reasonConsumeDetailItmes = reasonConsumeDetailItmes;
    }

    public Map<String, String> getReasonConsumeDetailItmesRevise() {
        return reasonConsumeDetailItmesRevise;
    }

    public void setReasonConsumeDetailItmesRevise(
            Map<String, String> reasonConsumeDetailItmesRevise) {
        this.reasonConsumeDetailItmesRevise = reasonConsumeDetailItmesRevise;
    }

    public int getReason() {
        return reason;
    }

    public void setReason(int reason) {
        this.reason = reason;
    }

    public int getReasonparam() {
        return reasonparam;
    }

    public void setReasonparam(int reasonparam) {
        this.reasonparam = reasonparam;
    }

    public int getConsumeReason() {
        return consumeReason;
    }

    public void setConsumeReason(int consumeReason) {
        this.consumeReason = consumeReason;
    }

    public int getConsumeReasonparam() {
        return consumeReasonparam;
    }

    public void setConsumeReasonparam(int consumeReasonparam) {
        this.consumeReasonparam = consumeReasonparam;
    }

    public Date getDateEnd() {
        return dateEnd;
    }

    public void setDateEnd(Date dateEnd) {
        this.dateEnd = dateEnd;
    }
}
